﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using Estructuras.Comunes;

namespace Estructuras.Consola.ConsolaOrdenarDatos
{
    /// <summary>
    /// Almacena las propiedades de un elemento específico.
    /// </summary>
    public class POrdenarDatos : Propiedades
    {
        /// <summary>
        /// Entrada de datos.
        /// </summary>
        public string Entrada
        {
            get
            {
                return this.getPropiedadString(COrdenarDatos.Entrada);
            }
            set
            {
                this.setOrAddPropiedad(COrdenarDatos.Entrada, value);
            }
        }

        /// <summary>
        /// Salida de datos.
        /// </summary>
        public string Salida
        {
            get
            {
                return this.getPropiedadString(COrdenarDatos.Salida);
            }
            set
            {
                this.setOrAddPropiedad(COrdenarDatos.Salida, value);
            }
        }

        /// <summary>
        /// Estructura de entrada.
        /// </summary>
        public string EstructuraEntrada
        {
            get
            {
                return this.getPropiedadString(COrdenarDatos.EstructuraEntrada);
            }
            set
            {
                this.setOrAddPropiedad(COrdenarDatos.EstructuraEntrada, value);
            }
        }

        /// <summary>
        /// Estructura de salida.
        /// </summary>
        public string EstructuraSalida
        {
            get
            {
                return this.getPropiedadString(COrdenarDatos.EstructuraSalida);
            }
            set
            {
                this.setOrAddPropiedad(COrdenarDatos.EstructuraSalida, value);
            }
        }

        /// <summary>
        /// Lista de campos clave.
        /// </summary>
        public List<string> ListaCamposClave
        {
            get
            {
                return this.getPropiedadListaString(COrdenarDatos.ListaCamposClave);
            }
            set
            {
                this.setOrAddPropiedad(COrdenarDatos.ListaCamposClave, value);
            }
        }

        /// <summary>
        /// Lista de indicadores de sentido de ordenación ascendente.
        /// </summary>
        public List<bool> ListaOrdenAscendente
        {
            get
            {
                return this.getPropiedadListaBool(COrdenarDatos.ListaSentidoOrden);
            }
            set
            {
                this.setOrAddPropiedad(COrdenarDatos.ListaSentidoOrden, value);
            }
        }

        /// <summary>
        /// Constructor por defecto.
        /// </summary>
        public POrdenarDatos()
            : base()
        {
        }

        /// <summary>
        /// Obtiene los parámetros a partir del fichero XML indicado.
        /// </summary>
        /// <param name="fichero">Fichero de configuración XML</param>
        override public void leer(string fichero)
        {
            base.leer(fichero);
            XmlDocument xml = LeerXml.AbrirFicheroParametros(fichero);

            this.Entrada = LeerXml.ObtenerValorCampo(xml, COrdenarDatos.RutaEntrada);
            this.Salida = LeerXml.ObtenerValorCampo(xml, COrdenarDatos.RutaSalida);
            this.EstructuraEntrada = LeerXml.ObtenerValorCampo(xml, COrdenarDatos.RutaEstructuraEntrada);
            this.EstructuraSalida = LeerXml.ObtenerValorCampo(xml, COrdenarDatos.RutaEstructuraSalida);
            
            int numeroCampos = LeerXml.ObtenerNumeroNodosCampo(xml, COrdenarDatos.RutaClaves);
            for (int indiceCampos = 0; indiceCampos < numeroCampos; indiceCampos++)
            {
                string campo = LeerXml.ObtenerValorCampo(xml, COrdenarDatos.RutaClaves, indiceCampos, "./" + COrdenarDatos.NodoClaveCampo);
                bool ordenAscendente = true;
                try
                { ordenAscendente = bool.Parse(LeerXml.ObtenerValorCampo(xml, COrdenarDatos.RutaClaves, indiceCampos, "./" + COrdenarDatos.NodoClaveOrden)); }
                catch (Exception)
                { ordenAscendente = true; }

                this.ListaCamposClave.Add(campo);
                this.ListaOrdenAscendente.Add(ordenAscendente);
            }
        }
    }
}
